if(NOT LIBC_COMPILER_HAS_FIXED_POINT)
  return()
endif()

add_custom_target(libc-stdfix-tests)

foreach(suffix IN ITEMS hr r lr hk k lk)
  add_libc_test(
    abs${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      AbsTest.h
    SRCS
      abs${suffix}_test.cpp
    COMPILE_OPTIONS
      ${libc_opt_high_flag}
    DEPENDS
      libc.src.stdfix.abs${suffix}
      libc.src.__support.fixed_point.fx_bits
  )
endforeach()

foreach(suffix IN ITEMS uhr ur ulr uhk uk)
  add_libc_test(
    sqrt${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      SqrtTest.h
    SRCS
      sqrt${suffix}_test.cpp
    COMPILE_OPTIONS
      ${libc_opt_high_flag}
    DEPENDS
      libc.src.stdfix.sqrt${suffix}
      libc.src.__support.CPP.bit
      libc.src.__support.fixed_point.fx_rep
      libc.src.__support.fixed_point.sqrt
      libc.src.__support.FPUtil.basic_operations
      libc.src.__support.FPUtil.sqrt
  )
endforeach()

foreach(suffix IN ITEMS hr r lr hk k lk uhr ur ulr uhk uk ulk)
  add_libc_test(
    round${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      RoundTest.h
    SRCS
      round${suffix}_test.cpp
    COMPILE_OPTIONS
      ${libc_opt_high_flag}
    DEPENDS
      libc.src.stdfix.round${suffix}
      libc.src.__support.fixed_point.fx_bits
  )

  add_libc_test(
    ${suffix}bits_test
    SUITE
      libc-stdfix-tests
    HDRS
      FxBitsTest.h
    SRCS
      ${suffix}bits_test.cpp
    COMPILE_OPTIONS
      ${libc_opt_high_flag}
    DEPENDS
      libc.src.stdfix.${suffix}bits
      libc.src.__support.CPP.bit
      libc.src.__support.fixed_point.fx_bits
  )

  add_libc_test(
    bits${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      BitsFxTest.h
    SRCS
      bits${suffix}_test.cpp
    DEPENDS
      libc.include.llvm-libc-types.int_k_t
      libc.include.llvm-libc-types.int_hr_t
      libc.include.llvm-libc-types.int_lk_t
      libc.include.llvm-libc-types.int_lr_t
      libc.include.llvm-libc-types.int_r_t
      libc.include.llvm-libc-types.uint_uhk_t
      libc.include.llvm-libc-types.uint_uhr_t
      libc.include.llvm-libc-types.uint_uk_t
      libc.include.llvm-libc-types.uint_ulk_t
      libc.include.llvm-libc-types.uint_ulr_t
      libc.include.llvm-libc-types.uint_ur_t
      libc.include.llvm-libc-types.int_hk_t
      libc.src.stdfix.bits${suffix}
      libc.src.__support.fixed_point.fx_rep
      libc.src.__support.fixed_point.fx_bits
  )

  add_libc_test(
    countls${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      CountlsTest.h
    SRCS
      countls${suffix}_test.cpp
    DEPENDS
      libc.src.stdfix.countls${suffix}
      libc.src.__support.fixed_point.fx_rep
      libc.src.__support.fixed_point.fx_bits
  )
endforeach()

foreach(suffix IN ITEMS r lr k lk ur ulr uk ulk)
  add_libc_test(
    idiv${suffix}_test
    SUITE
      libc-stdfix-tests
    HDRS
      IdivTest.h
    SRCS
      idiv${suffix}_test.cpp
    DEPENDS
      libc.src.stdfix.idiv${suffix}
      libc.src.__support.fixed_point.fx_bits
      libc.hdr.signal_macros
  )
endforeach()

foreach(suffix IN ITEMS r)
  add_libc_test(
    ${suffix}divi_test
    SUITE
      libc-stdfix-tests
    HDRS
      DivITest.h
    SRCS
      ${suffix}divi_test.cpp
    DEPENDS
      libc.src.stdfix.${suffix}divi
      libc.src.__support.fixed_point.fx_bits
      libc.hdr.signal_macros
  )
endforeach()

add_libc_test(
  uhksqrtus_test
  SUITE
    libc-stdfix-tests
  HDRS
    ISqrtTest.h
  SRCS
    uhksqrtus_test.cpp
  COMPILE_OPTIONS
    ${libc_opt_high_flag}
  DEPENDS
    libc.src.stdfix.uhksqrtus
    libc.src.__support.CPP.bit
    libc.src.__support.fixed_point.fx_rep
    libc.src.__support.fixed_point.sqrt
    libc.src.__support.FPUtil.basic_operations
    libc.src.__support.FPUtil.sqrt
)

add_libc_test(
  uksqrtui_test
  SUITE
    libc-stdfix-tests
  HDRS
    ISqrtTest.h
  SRCS
    uksqrtui_test.cpp
  COMPILE_OPTIONS
    ${libc_opt_high_flag}
  DEPENDS
    libc.src.stdfix.uksqrtui
    libc.src.__support.CPP.bit
    libc.src.__support.fixed_point.fx_rep
    libc.src.__support.fixed_point.sqrt
    libc.src.__support.FPUtil.basic_operations
    libc.src.__support.FPUtil.sqrt
)

add_libc_test(
  exphk_test
  SUITE
    libc-stdfix-tests
  HDRS
    ExpTest.h
  SRCS
    exphk_test.cpp
  COMPILE_OPTIONS
    ${libc_opt_high_flag}
  DEPENDS
    libc.src.stdfix.exphk
    libc.src.math.exp
    libc.src.__support.CPP.bit
    libc.src.__support.fixed_point.fx_rep
    libc.src.__support.FPUtil.basic_operations
)

add_libc_test(
  expk_test
  SUITE
    libc-stdfix-tests
  HDRS
    ExpTest.h
  SRCS
    expk_test.cpp
  COMPILE_OPTIONS
    ${libc_opt_high_flag}
  DEPENDS
    libc.src.stdfix.expk
    libc.src.math.exp
    libc.src.__support.CPP.bit
    libc.src.__support.fixed_point.fx_rep
    libc.src.__support.FPUtil.basic_operations
)

set(macros_depends)

foreach(s IN ITEMS r hr lr k hk lk)
  list(APPEND macros_depends
    libc.src.stdfix.abs${s}
    libc.src.stdfix.countls${s}
    libc.src.stdfix.countlsu${s}
    libc.src.stdfix.round${s}
    libc.src.stdfix.roundu${s}
  )
endforeach()

add_libc_test(
  macros_test
  SUITE libc-stdfix-tests
  SRCS macros_test.cpp
  DEPENDS
    libc.include.stdfix
    ${macros_depends}
)

